package TestDemo;

import org.junit.jupiter.api.Test;

/**
     * 演示获取Class c对象的三种方法
     *@fileName ReflectGetClass.java
     */
public class ReflectGetClass {


    String name = "测试name";
    ReflectGetClass() {
    }

    public static void main(String[] args) throws NoSuchFieldException {
        ReflectGetClass reflectGetClass = new ReflectGetClass();
        Class temp;
        temp = reflectGetClass.get1();
        System.out.println("getName:"+temp.getName());
        System.out.println("getCanonicalName:"+temp.getCanonicalName());
        System.out.println("getConstructors:"+temp.getConstructors());
    }

    public void ReflectGetClass()
    {
    }
    public void ReflectGetClass(int o)
    {
    }

    public void ReflectGetClass(int o,String str)
    {
    }

    public void ReflectGetClass(String str,int o)
    {
    }


    /**
     * 法1：通过对象---对象.getClass()来获取c(一个Class对象)
     */
    @Test
    public Class get1() {
        Person p = new Person("Jack", 23);
        Class c = p.getClass();//来自Object方法
        return c;
    }

    /**
     * 法2：通过类(类型)---任何数据类型包括(基本数据类型)都有一个静态的属性class ，他就是c 一个Class对象
     */
    @Test
    public Class get2() {
        Class c = Person.class;
        Class c2 = int.class;
        return c;
    }


    /**
     * 法3：通过字符串(类全名 )---能够实现解耦：Class.forName(str)
     */
    @Test
    public Class get3(){
        Class c = null;
        try {
            c = Class.forName("TestDemo.Person");
            return c;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return c;
    }
}

class Person {
    String Name;
    int age;

    Person(String name, int age) {
        this.Name = name;
        this.age = age;
    }
}
